Artikel online |
von Robbie Schäfer
Anlagen:
Sie können das in diesem Artikel verwendete
Beispiel-Skript Geburtstage.r downloaden
(3K) oder online anzeigen. Sollten Sie Fragen haben, können Sie mich unter robbie@egge.net anschreiben.
REBOL
ist eine neue Programmiersprache, die zeitgleich auf verschiedenen Platformen
entwickelt wird. Und die gute Nachricht: Diesmal spielt auch der Amiga wieder
bei einer Neuentwicklung in der ersten Liga mit. Grund genug, sich REBOL einmal
genauer anzuschauen.
REBOL steht für Relative Expression Based Object Language
und wurde von Carl Sassenrath entwickelt, der auch als Vater des AmigaOS gilt.
Maßgebend für die Entwicklung von REBOL war der Gedanke, daß
der Computer eigentlich dafür entwickelt wurde, den Menschen bei seinen täglichen
Aufgaben zu unterstützen. Aber bis heute muß der Mensch sich dem
Computer anpassen. Die Devise für REBOL lautet also: einfache Dinge sollen
einfach zu realisieren sein. Das führt dazu, daß man für REBOL
sehr wenig Syntax zu lernen hat, so daß diese Sprache auch für
Computereinsteiger geeignet ist.
REBOL ist darüber hinaus
hervorragend als Internetsprache geeignet. So sind zum Beispiel Datentypen für
E-Mail, FTP und HTTP eingebaut. An späterer Stelle werde ich Ihnen zeigen,
wie einfach diese Internetfunktionalität zu nutzen ist. Dabei wurde auch
nicht vergessen, wie wichtig es ist, so eine Sprache auf möglichst vielen
Plattformen zu haben. Dadurch können die Systeme, welche REBOL unterstützen
direkt über REBOL miteinander kommunizieren. Außer der Amiga Version
gibt es bereits Implementierungen für BeOS, BSD, Linux, MacOS, Solaris,
Unix und Windows.
Sollte Ihre Neugier nun geweckt sein, können wir
ja sofort die ersten Schritte in REBOL machen, denn (noch eine gute Nachricht)
REBOL gibt es umsonst! Unter der Adresse
www.rebol.com können
Sie sich REBOL für Ihre Lieblingsplattform besorgen. Übrigens brauchen
Sie sich keine Sorgen um lange Downloadzeiten zu machen, denn das Archiv der
aktuellen Version (rebol-1.0.3.1.lzh) benötigt noch nicht einmal 200kb. Das
Archiv mit den Dokumentationen im HTML-Format benötigt nochmal etwa 100kb.
Anschließend kopieren Sie das Archiv in ein Verzeichnis (z.B.: work:Rebol)
und entpacken es. Danach sollten Sie ein Verzeichnis namens rebol-1.0.3
vorfinden, wo sich die Dateien rebol, rebol.r und user.r befinden. rebol ist der
REBOL-Interpreter, rebol.r und user.r sind REBOL-Scripte, in denen die
wichtigsten Systemeinstellungen gemacht werden. Dabei sollten Sie tunlichst
nicht die Datei rebol.r verändern, sonst werden Sie wohl um eine
Neuinstallation nicht herumkommen. Die Einstellungen, die für Sie von
Bedeutung sind können Sie in user.r verändern. Die Parameter sind nötig,
um mit REBOL E-Mail lesen und schreiben zu können, aber REBOL funktioniert
auch ohne. Unter host tragen Sie die Adresse des Mailservers ein, also
sowas wie "mail.provider.de", unter user ihren Loginnamen
und unter pass das Passwort, unter REBOL/Email-head/from
noch ihre E-Mail-Adresse. Speichern Sie die Datei ab, und schon können wir
mit REBOL loslegen.
Da REBOL eine Interpreter-Sprache ist, haben Sie
die Wahl, ob Sie ein REBOL-Script starten, oder ob Sie REBOL-Befehle in einer
REBOL-Shell eingeben. Beginnen Sie erstmal mit der zweiten Möglichkeit.
Geben Sie in Ihrer Shell rebol ein. Als erstes wird dann die Datei
user.r ausgeführt. Sobald das geschehen ist, können Sie dann Ihre
Eingaben tätigen. Also geben Sie mal print "Hello World"
ein. Und siehe da, REBOL gibt Ihnen Hello World aus. Aber REBOL kann
noch mehr:
Lassen Sie uns einmal wirklich die Welt begrüßen.
Geben Sie
send friend@provider.de "Hello World" ein (Sie sollten natürlich
eine existierende Adresse verwenden). Wenn die Eintragungen in user.r korrekt
waren und Sie online sind, bekommt Ihr Freund nun eine E-Mail mit dem Text "Hello
World" zugeschickt. Beeindruckend, nicht wahr?
Nun aber zu den
Fakten. In REBOL werden Daten als Werte (Values) bezeichnet. Davon gibt es eine
Reihe unterschiedlicher Typen, von denen ich hier nur einige aufliste (eine
vollständige Beschreibung in englischer Sprache findet sich in den
Dokumentationen quick.html, users.html, experts.html):
Zahlen
(Numbers): 1223 -23 3.1415
Daten (Dates): 12.10.1988 20-Apr-1998 13/6/1970
Strings: "Hello World"
Dateien (Files): %user.r %pie.jpg
Email: info@rebol.com
URLs: http://www.rebol.com
Diese Beispiele sollten erstmal ausreichen. REBOL-Scripte bestehen aus
Wörtern, die zu einem gewissen Zeitpunkt ausgewertet werden.
Wörter entsprechen Variablen in anderen Programmiersprachen, aber
sind nicht auf die Verwendung als solche beschränkt. Dabei ist es egal, ob
die Wörter groß oder klein geschrieben werden, also
TEST, test und Test sind in REBOL ein und dasselbe
Wort. Diesen Wörtern können nun auch Werte zugewiesen werden:
test: "Hallo Welt"
Das Wort test enthält nun den
String "Hallo Welt". Geben Sie nun
print test ein, wird der Inhalt von test ausgewertet, also
statt test wird der String ausgegeben. Versuchen Sie das gleiche
nochmal mit
test: [1 + 1] print test
Wie Sie sehen, wird "2" ausgegeben, was daran liegt, daß der
Ausdruck in
test erst ausgewertet wird, also die Addition durchgeführt wird.
In diesem Beispiel haben Sie nun auch schon Blöcke kennengelernt, mit denen
Sie Werte gruppieren können. Blöcke werden durch eckige Klammern
gekennzeichnet und können alle möglichen Werte enthalten, auch
REBOL-Anweisungen und andere Blöcke.
Definieren Sie nun den
folgenden Block:
Daten: ["12.10.1960" "1.1.1943" "4.6.1970" "8.10.1989"]
und geben Sie dann print make date! first Daten ein. Nun, was ist
passiert? REBOL fasst Daten als Liste von Werten auf. Um nun auf ein
Element in der Liste zugreifen zu können, bietet REBOL für die ersten
fünf Elemente vereinfachte Zugriffsfunktionen an (first, second, third,
fourth, fifth). Für den Englischsprachigen mit Sicherheit sehr praktisch.
Falls Sie auf ein weiter entferntes Listenelement zugreifen wollen, dann geht
das mit der pick Anweisung. Beispiel:
Buchstaben: [a b c d e f g h i j k] pick Buchstaben 7
liefert ein "g". Zurück zum Daten-Beispiel. Die
Auswertung von first Daten liefert also den String 12.10.1960.
Sie können das auch nochmal mit print first Daten ausprobieren.
make date! wiederum wandelt den ausgewerteten Ausdruck first
Daten in das REBOL-interne Datumsformat um, welches dann anschließend
mit print ausgegeben wird. Dabei ist es fast egal, wie Sie das Datum definiert
haben. Die REBOL Datentypen sind intelligent genug, um zu erkennen, daß
12.10.1960, 12-10-1960 , 1960/10/12 alles Datumsangaben sind. Falls ein Wert
nicht umgewandelt werden kann, z.B. 12.100.1990, so wird ein none
zugewiesen.
Natürlich bietet REBOL auch Kontrollstrukturen, doch
dafür sollten Sie jetzt mal die REBOL-Shell verlassen, und Sich den
REBOL-Scripten zuwenden. Geben Sie also
quit ein, um REBOL zu verlassen.
REBOL-Scripte sind einfache
Textdateien, in denen Wörter und REBOL-Anweisungen stehen. In der Regel
haben die Dateinamen der REBOL-Scripte die Endung ".r", was aber nicht
zwingend notwendig ist. Schreiben Sie nun mit einem Texteditor folgende Zeilen
ab, und speichern Sie das Script unter den Namen test.r:
REBOL [] loop 10 [ print "REBOL ist toll!" ]
Ein REBOL-Script beginnt immer mit REBOL gefolgt von einem Block,
der in unserem Beispiel leer ist. Normalerweise sollten in dem Block aber Daten
wie Titel, Autor, Version usw. verzeichnet sein. Durch einen Fehler in REBOL ist
es zur Zeit leider noch nicht möglich, die REBOL-Scripte aus anderen
Verzeichnissen zu starten. Achten sie also vorerst darauf, daß sich Ihre
REBOL-Scripte im gleichen Verzeichnis wie rebol befinden. Der Fehler
ist den Entwicklern aber bekannt und sollte in den nächsten Versionen nicht
mehr auftauchen. Gestartet werden kann das Script nun auf zwei verschiedene
Arten. Die erste Möglichkeit besteht darin, REBOL mit dem Script
aufzurufen, also
rebol test.r. Der andere Weg ist, das Script aus REBOL selbst zu
starten. Dazu starten sie also erstmal REBOL mit dem Befehl rebol und
geben danach do %test.r ein. Wie vorhin angedeutet, werden Dateien in
REBOL mit einem %-Zeichen kenntlich gemacht. In beiden Fällen befinden Sie
sich nach Ablauf des Scriptes in der REBOL-Shell. Um REBOL nach Beendigung des
Scriptes automatisch zu verlassen, fügen Sie dem Script als letzten Befehl
noch ein quit hinzu.
Nun haben Sie mit loop bereits
den ersten Schleifentyp in REBOL kennengelernt. Die Anweisungen in dem folgenden
Block werden so oft ausgeführt, wie durch die Zahl hinter loop
angegeben ist. Will man nun auch auf den Zähler selbst zugreifen, so geht
das mit repeat wie im folgenden Beispiel:
repeat i 9 [ if even? i [ print [i "ist gerade"] ] else [ print [i "ist ungerade"] ] ]
Verzweigungen kann man wie in anderen Programmiersprachen mit if
realisieren. Mit even? i wird überpüft, ob i eine gerade
Zahl ist, und diese Überprüfung liefert dementsprechend true
oder false zurück. Der Block nach \if\ wird nur bei dem Ergebnis
true ausgeführt. Ansonsten wird der Block nach
else ausgeführt.
Nachdem ich Ihnen noch zeige, wie man
in REBOL Funktionen definiert, haben Sie das Rüstzeug für ein größeres
Beispiel mit praktischem Nutzen. Funktionen werden ganz einfach erstellt. Nach
dem Schlüsselwort func kommt ein Block mit den
Funktionsparametern, und der darauffolgende Block ist der Funktionsrumpf, in dem
die Anweisungen stehen. Beispiel:
mw: func [a b c] [(a + b + c) / 3] print mw 3 4 5
Nun aber zu dem wirklich "nützlichen" Beispiel:
Vergessen Sie auch so oft die Geburtstage Ihrer Freunde und Verwandten? Und
schimpfen diese Sie regelmäßig deswegen aus? Dann ist geburtstage.r
genau das richtige REBOL-Script für Sie. Damit können Sie eine Datei
von Ihren Freunden anlegen, die jeweils Name, Vorname, E-Mail und den Geburtstag
enthält. Auf Wunsch vergleicht dann das REBOL-Script das Geburtsdatum mit
dem heutigen Datum, und schickt an alle, die Geburtstag haben, eine E-mail mit
dem Betreff "Happy Birthday".
Das Listing können Sie
hier online anzeigen lassen. Wenn Sie es
benutzen wollen, dann können Sie die Version ohne
Zeilennummern downloaden, da ich sie nur eingefügt habe, um Ihnen
einige Dinge zum Listing erklären zu können. REBOL kann mit den
Zeilennummern nichts anfangen. Die ersten 7 Zeilen sind der obligatorische
REBOL-Header. Danach geht es dann mit dem eigentlichen Script los. Zuerst wird
das Wort choice definiert, mit dem später im Listing die Menuauswahl
realisiert wird. Dann wird versucht, die Datei friends.dat zu öffnen. Beim
ersten Programmstart existiert diese natürlich noch nicht. Deshalb wird
friends im else-Zweig ein leerer Block zugewiesen. Die Funktion displayMenu
ist eigentlich ziemlich selbsterklärend. Nur sollte erwähnt werden, daß
die Zeichenfolge ^/ für ein Zeilenumbruch steht und daß
prin kein Druckfehler ist, sondern das gleiche bewirkt wie print,
allerdings ohne einen Zeilenumbruch am Ende. Schauen Sie sich nun die Zeile 73
an. Dort beginnt unsere Hauptschleife, die solange durchlaufen wird, bis choice
den Wert "0" hat. Je nach Wert von choice wird eine der vier
Funktionen aufgerufen, die alle mit der Liste friends arbeiten. In
addFriend (Zeile 24) werden die Variablen name, vorname,
email,
geburtstag mit input eingelesen, und mit der make! Funktion
sofort in den richtigen Datentyp umgewandelt. In Zeile 37 werden die vier
Variablen dann zu einem Block zusammengefasst, und mit insert tail an
das Ende der Liste friends gehängt. Um später mit deleteFriend
einen ganzen Datensatz zu löschen, ist es wichtig zu wissen, in welcher
Reihenfolge die Parameter eingefügt wurden. Nämlich [name vorname
email geburtstag]. In deleteFriend wird nun nach einer E-Mail-Adresse
gesucht, da die im Gegensatz zu den anderen Parametern nicht doppelt vorkommen
darf. Daher muß man, wenn die E-Mail-Adresse gefunden wurde in der Liste
zwei Schritte zurückgehen, um auf den ersten Parameter name zu
kommen, was mit
skip ... -2 geschieht. Mit remove/part ... 4 werden von dort
aus dann vier Elemente aus der Liste entfernt. In showFriends durchläuft
die forskip Anweisung (Zeile 51) die Liste indem sie jeweils vier
Elemente überspringt. Die Zeile 60 in checkDates verdient noch
einmal eine genauere Betrachtung. Das Wort now enthält die
Systemzeit, und zwar im Format
Tag/Monat/Jahr/Stunde:Minute:Sekunde. Da wir für die Geburtstage
ja nur das Datum benötigen, holen wir uns die Werte mit
first,second,third heraus, fassen die Einzelwerte
mit reduce zu einem Wert zusammen und machen daraus wiederum ein
Datum. Anschließend wird das heutige Datum mit jedem Geburtstag
verglichen, und falls die Daten (bis auf das Jahr) gleich sind, so wird eine
E-Mail an das Geburtstagskind geschickt. Sobald Sie im Hauptmenu eine "0"
eingeben, wird die friends-Liste abgespeichert, und das Programm
verlassen. (Falls die E-Mail Einstellungen in der user.r nicht korrekt sind,
wird das Script beim Versuch die E-Mail zu verschicken mit einer Fehlermeldung
abbrechen.
Ich vermute mal, daß Ihnen mittlerweile der Kopf
rauchen wird, denn für einen einführenden Bericht haben Sie bereits
viel über REBOL erfahren können. Aber Rebol hat ja auch sehr viel zu
bieten. So bin ich zum Beispiel noch nicht auf REBOL-Objekte eingegangen, kann
Ihnen aber schonmal verraten, daß sie mit
remove/part schon eine Objekt-Methode benutzt haben. Auch konnte ich
nur auf einen kleinen Teil der über 200 Vordefinierten Wörter
eingehen.
REBOL ist jetzt schon sehr mächtig, und für die nächsten
Versionen sind unter anderem noch folgende Dinge geplant:
- GUI
-
Grafik
- Sound
- Unicode
- Parser.
Wer also jetzt Lust auf mehr bekommen hat, der kann sich ja noch ein bißchen
auf den
REBOL-Webseiten
umschauen. Neben den REBOL-Programmen und Dokumentationen finden sich dort auch
viele REBOL-Scripte, unter anderem eines, mit denen die REBOLer ihre Webseiten
warten. Und man kann sich dort auch in die REBOL-Mailingliste eintragen, wo
recht reger Betrieb herrscht, und sich auch immer mal wieder die
REBOL-Entwickler zu Wort melden.
© 1998-2000
thomas raukamp communications.
All
rights reserved. Webmaster:
Nico Barbat.